package com.yxy.config;

import com.yxy.interceptor.JwtTokenInterceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

// @Configuration表示这是一个配置类，Spring会扫描并加载这个类中的配置。
@Configuration
@Slf4j
public class WebMvcConfiguration implements WebMvcConfigurer {

    @Autowired
    private JwtTokenInterceptor jwtTokenInterceptor;
    /**
     * 注册自定义拦截器
     * @param registry
     */
    public void addInterceptors(InterceptorRegistry registry){
        log.info("开始注册自定义拦截器...");
        registry.addInterceptor(jwtTokenInterceptor)
                .addPathPatterns("/bfbbs/**")  // 拦截所有以 /bfbbs/ 开头的路径
                .excludePathPatterns("/bfbbs/login")  // 放行登录接口
                .excludePathPatterns("/bfbbs/register") // 放行注册接口
                .excludePathPatterns("/bfbbs/generateCaptcha") // 放行验证码接口
                .excludePathPatterns("/bfbbs/book/page") // 放行书籍分页查询接口
                .excludePathPatterns("/bfbbs/film/page") // 放行影视分页查询接口
                .excludePathPatterns("/bfbbs/checkToken") // 放行检查token接口
                .excludePathPatterns("/bfbbs/book/getDetailById/{id}") // 放行根据id查询书籍详情接口
                .excludePathPatterns("/bfbbs/film/getDetailById/{id}") // 放行根据id查询影视详情接口
                .excludePathPatterns("/bfbbs/getReviews") // 放行获取评论接口
                .excludePathPatterns("/bfbbs/getRate") // 放行获取评分接口
                .excludePathPatterns("/bfbbs/getWantOrSeeStatus");  // 放行获取想看或看过状态接口
    }

    /**
     * 配置跨域 （用nginx解决跨域时，CORS配置要关）
     * @param registry 注册表对象，用于添加CORS配置
     */
    @Override
    // addCorsMappings 方法用于配置CORS（Cross-Origin Resource Sharing，跨域资源共享）
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")   // 用于指定哪些路径需要启用CORS支持，，/salary/** 表示所有以 /salary/ 开头的路径都会启用CORS支持
                .allowedOrigins("http://localhost:9090")    // 用于指定允许跨域请求的源
                // 浏览器在发送实际请求之前会先发送一个预检请求（Preflight Request），以确认服务器是否允许该跨域请求。预检请求通常是一个 OPTIONS 请求
                .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") // 用于指定允许的HTTP方法
                .allowedHeaders("*")    // 用于指定允许的请求头，* 表示允许所有请求头
                // 指定是否允许发送凭据（如cookies、HTTP认证信息等）。如果允许发送凭据，allowedOrigins 必须是一个具体的源，不能使用*
                .allowCredentials(true);
    }
}
